package com.shujia.day08;

class Outer{
    int a = 10;
    private int d = 20;
    static int e = 50;

    // 这是Demo类中的内部类
     class Inner{
//        static int staticNum = 22;

        int b = 20;



        public Inner(int b) {
            this.b = b;
        }

        public Inner() {
        }


        public void fun(){
            int c = 30;
            System.out.println("这是内部类中的一个方法");
            System.out.println("Outer.a:"+a);
            System.out.println("Inner.b:"+b);
            System.out.println("Inner.c:"+c);
            System.out.println("Outer.d:"+d);
            System.out.println("Outer.e:"+e);
        }
    }

    static int outerStaticNum = 10;
    int outerNoStaticNum = 10;

    public void print(){
        System.out.println(outerStaticNum); // 普通的成员方法可以调用 静态成员
//        static int printNum = 10; // 普通成员方法中不能定义静态的成员

    }

    public static void staticPrint(){
        System.out.println(outerStaticNum);
//        System.out.println(outerNoStaticNum);  // 静态的成员方法，不能直接调用非静态的成员
//        print();
    }


}

class Outer2{

    static class Inner2{

        static int staticNum = 22;
        public void fun(){
            System.out.println("这是Outer2中的一个静态内部类");
        }
    }
}



public class Code03InnerClass {
    public static void main(String[] args) {
        /*
            内部类：
                ① 对于内部类创建对象时，如果内部类使用的是默认修饰符,那么就需要先创建外部类的对象，再调用其new 内部类构造方法获取内部类的对象
                        定义格式： 外部类名称.内部类名 inner = new 外部类构造方法.new 内部类构造方法;

                ② 对于内部来说，既可以定义自身的成员变量 也可以获取到父类中的成员变量

                ③ 对于内部类来说，可以使用static修饰成一个静态内部类 其构造对象的方式会不一样
                        外部类名称.内部类名 inner2 = new 外部类名称.内部类构造方法;

            注意：
                在静态内部类中可以直接定义一个静态的成员，通过外部类的名称.内部类名称.成员
                在普通内部类中不能给定静态修饰符，为什么？
                    普通的内部类，就相当于是外部类中的一个普通成员，成员内部不能直接定义静态修饰的内容



         */
        // 需求：想要调用Inner内部类中的fun()成员方法 -> 获取Inner类中的对象

        Outer.Inner inner = new Outer().new Inner(44);
        inner.fun();

        Outer2.Inner2 inner2 = new Outer2.Inner2();

        inner2.fun();

        System.out.println(Outer2.Inner2.staticNum);

    }
}
